﻿//以二进制方式从文件中读取学生信息的函数
#include "student.h"

void load_bin()
{
    FILE* fp;
    char fname[100] = { 0 };
    int i = 0, flag;
    char choice;

    // 询问是否以二进制方式读取
    printf("是否以二进制方式读取文件？(y/n): ");
    choice = _getche();
    printf("\n");

    if (choice != 'y' && choice != 'Y') {
        printf("取消二进制读取操作。\n");
        return;
    }

    // 获取文件名
    printf("请输入文件名(如 stu.dat): ");
    if (scanf_s(" %99s", fname, (unsigned)_countof(fname)) != 1) {
        printf("文件名输入无效！\n");
        CLEAR_STDIN();
        return;
    }

    // 打开文件
    errno_t err = fopen_s(&fp, fname, "rb");
    if (err != 0 || fp == NULL) {
        printf("不能打开文件，文件读取失败！\n");
        return;
    }

    // 逐条读取数据
    printf("\n开始读取文件内容...\n");
    while (1) {
        flag = fread(&stu[i], sizeof(struct stu_type), 1, fp);
        if (flag == 0) {
            break;
        }

        // 显示当前读取的学生信息
        printf("\n读取第%d条记录:\n", i + 1);
        printf("学号: %d\n", stu[i].studentnumber);
        printf("姓名: %s\n", stu[i].studentname);
        printf("学院: %s\n", stu[i].collegename);

        i++;

        // 检查是否达到最大容量
        if (i >= MAX_N) {
            printf("\n警告：已达到最大学生数限制(%d)，停止读取更多记录。\n", MAX_N);
            break;
        }
    }

    stu_num = i;
    printf("\n从文件中成功读取%d条记录!\n", stu_num);
    fclose(fp);

    // 询问是否显示所有学生信息
    printf("\n是否显示所有学生信息？(y/n): ");
    choice = _getche();
    printf("\n");

    if (choice == 'y' || choice == 'Y') {
        display_all();
    }
}